package cn.jinbyte.web.exception;

import cn.jinbyte.core.exception.BussException;
import cn.jinbyte.core.exception.SysException;
import cn.jinbyte.core.model.ApiRet;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.BindException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.resource.NoResourceFoundException;

import java.util.Objects;

/**
 * 接口错误处理器
 *
 * @author jinty
 */
@Slf4j
@RestControllerAdvice
@SuppressWarnings("unused")
public class GlobalErrorHandler {

    /**
     * 业务异常处理器
     *
     * @param error 业务异常
     * @return 错误信息
     */
    @ExceptionHandler(BussException.class)
    public ApiRet<Void> handleBussException(BussException error) {
        return ApiRet.error(error);
    }

//    /**
//     * 未登录异常处理器
//     *
//     * @param error 未登录异常
//     * @return 错误信息
//     */
//    @ExceptionHandler(NotLoginException.class)
//    @ResponseStatus(code = HttpStatus.UNAUTHORIZED)
//    public ApiRet<String> handleNotLoginException(NotLoginException error) {
//        log.error(error.getMessage());
//        return ApiRet.error("用户未登录");
//    }
//
//    /**
//     * 登录异常处理器
//     *
//     * @param error 登录异常
//     * @return 错误信息
//     */
//    @ExceptionHandler(SaTokenException.class)
//    public ApiRet<String> handleSaTokenException(SaTokenException error) {
//        log.error(error.getMessage());
//        return ApiRet.error("用户登录信息错误");
//    }

    /**
     * 参数绑定异常处理器
     *
     * @param error 参数绑定异常
     * @return 错误信息
     */
    @ExceptionHandler(BindException.class)
    public ApiRet<String> handleBindException(BindException error) {
        log.error(error.getMessage());
        String message = Objects.requireNonNull(error.getBindingResult().getFieldError()).getDefaultMessage();
        return ApiRet.error(message);
    }

    /**
     * 非法参数异常处理器
     *
     * @param error 非法参数异常
     * @return 错误信息
     */
    @ExceptionHandler(IllegalArgumentException.class)
    public ApiRet<String> handleIllegalArgumentException(IllegalArgumentException error) {
        log.error(error.getMessage());
        return ApiRet.error(error.getMessage());
    }

    /**
     * 非法状态异常处理器
     *
     * @param error 非法状态异常
     * @return 错误信息
     */
    @ExceptionHandler(IllegalStateException.class)
    public ApiRet<String> handleIllegalStateException(IllegalStateException error) {
        log.error(error.getMessage());
        return ApiRet.error(error.getMessage());
    }

    /**
     * 资源未找到异常处理器
     */
    @ExceptionHandler(NoResourceFoundException.class)
    public ApiRet<String> handleNoResourceFoundException(NoResourceFoundException error) {
        log.error(error.getMessage());
        return ApiRet.error("请求资源不可用");
    }

    /**
     * 系统异常处理器
     *
     * @param error 系统异常
     * @return 错误信息
     */
    @ExceptionHandler(SysException.class)
    public ApiRet<Void> handleSysException(SysException error) {
        return ApiRet.error(error);
    }

    /**
     * 全局异常处理器
     *
     * @param error 全局异常
     * @return 错误信息
     */
    @ExceptionHandler(Exception.class)
    public ApiRet<Void> handleException(Exception error) {
        log.error(error.getMessage(), error);
        return ApiRet.error(error);
    }

}
